/**
 * @company : 版权所属 四川北星惯牌科技有限公司
 * @contact : 刘经理 19326416371
 **/
/**
 * @description 判断数据类型
 * @param {Any} val 需要判断类型的数据
 * @return string
 */
export function isType(val) {
	if (val === null) return "null";
	if (typeof val !== "object") return typeof val;
	else return Object.prototype.toString.call(val).slice(8, -1).toLocaleLowerCase();
}


/**
 * 判断两个对象是否相同
 * @param a 要比较的对象一
 * @param b 要比较的对象二
 * @returns 相同返回 true，反之则反
 */
export function isObjectValueEqual(a, b) {
	if (!a || !b) return false;
	let aProps = Object.getOwnPropertyNames(a);
	let bProps = Object.getOwnPropertyNames(b);
	if (aProps.length != bProps.length) return false;
	for (let i = 0; i < aProps.length; i++) {
		let propName = aProps[i];
		let propA = a[propName];
		let propB = b[propName];
		if (!b.hasOwnProperty(propName)) return false;
		if (propA instanceof Object) {
			if (!isObjectValueEqual(propA, propB)) return false;
		} else if (propA !== propB) {
			return false;
		}
	}
	return true;
}



/**
 * @description 获取当前时间对应的提示语
 * @return string
 */
export function getTimeState() {
	// 获取当前时间
	let timeNow = new Date();
	// 获取当前小时
	let hours = timeNow.getHours();
	// 判断当前时间段
	if (hours >= 6 && hours <= 10) return `早上好 ⛅`;
	if (hours >= 10 && hours <= 14) return `中午好 🌞`;
	if (hours >= 14 && hours <= 18) return `下午好 🌞`;
	if (hours >= 18 && hours <= 24) return `晚上好 🌛`;
	if (hours >= 0 && hours <= 6) return `凌晨好 🌛`;
}


/**
 * @description 扁平化数组对象(主要用来处理路由菜单)
 * @param {Array} menuList 所有菜单列表
 * @return array
 */
export function getFlatArr(menuList) {
	let newMenuList = JSON.parse(JSON.stringify(menuList));
	return newMenuList.reduce((pre, current) => {
		let flatArr = [...pre, current];
		if (current.children) flatArr = [...flatArr, ...getFlatArr(current.children)];
		return flatArr;
	}, []);
}

/**
 * @description 使用递归，过滤需要缓存的路由（暂时没有使用）
 * @param {Array} menuList 所有菜单列表
 * @param {Array} cacheArr 缓存的路由菜单 name ['**','**']
 * @return array
 * */
export function getKeepAliveRouterName(menuList, keepAliveArr) {
	menuList.forEach(item => {
		item.meta.isKeepAlive && item.name && keepAliveArr.push(item.name);
		item.children?.length && getKeepAliveRouterName(item.children, keepAliveArr);
	});
	return keepAliveArr;
}

/**
 * 格式化数字
 * @param {string} prefix 前缀
 * @param {'exact' | string} type 格式类型：exact=精确值，其它=大致数量
 * @param {number} num 销量
 * @return {string} 格式化后的销量字符串
 */
export function formatNum(prefix, type, num) {
	num = (num || 0);
	// 情况一：精确数值
	if (type === 'exact') {
		return prefix + num;
	}
	// 情况二：小于等于 10
	if (num < 10) {
		return `${prefix}≤10`;
	}
	// 情况三：大于 10，除第一位外，其它位都显示为0
	// 例如：100  - 199  显示为 100+
	//      9000 - 9999 显示为 9000+
	const numStr = num.toString();
	const first = numStr[0];
	const other = '0'.repeat(numStr.length - 1);
	return `${prefix}${first}${other}+`;
}

/**
 * 格式化时间
 * @param {string} date 日期/时间戳
 * @param {string} format 格式
 * @return {string} 格式化后的时间字符串
 * date指的是new Date()/时间戳,fmt是格式化的格式
 */
export function formatDate(date, fmt = 'yyyy-MM-dd hh:mm:ss') {
	const newDate = isMillisecondTimestamp(date) ? new Date(date) : new Date(date * 1000)
	var o = {
		"M+": newDate.getMonth() + 1, //月份 
		"d+": newDate.getDate(), //日 
		"h+": newDate.getHours(), //小时 
		"m+": newDate.getMinutes(), //分 
		"s+": newDate.getSeconds(), //秒 
		"q+": Math.floor((newDate.getMonth() + 3) / 3), //季度 
		"S": newDate.getMilliseconds() //毫秒 
	};
	//(y+)匹配多个y，比如yyyy
	if (/(y+)/.test(fmt)) {
		// RegExp.$1是RegExp的一个属性,指的是与正则表达式匹配的第一个 子匹配(以括号为标志)字符串
		fmt = fmt.replace(RegExp.$1, (newDate.getFullYear() + "").substr(4 - RegExp.$1.length));
	}
	for (var k in o) {
		if (new RegExp("(" + k + ")").test(fmt)) {
			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
		}
	}
	return fmt;
}

/**
 * 计算倒计时
 * @param {*} time 
 * @returns 
 */
export function countDown(time) {
	let timerObj = {};
	var nowTime = +new Date(); // 返回的是当前时间总的毫秒数
	var inputTime = +new Date(time); // 返回的是用户输入时间总的毫秒数
	var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数
	var d = parseInt(times / 60 / 60 / 24); // 把秒数转换成天数  （parselnt把得到的数转换为整数）
	d = d < 10 ? '0' + d : d; //这里为了让时间数好看一点，比如把4天改成04天，所以加了三元判定，下面也是如此；
	var h = parseInt(times / 60 / 60 % 24); //时
	h = h < 10 ? '0' + h : h;
	var m = parseInt(times / 60 % 60); //分
	m = m < 10 ? '0' + m : m;
	var s = parseInt(times % 60); // 秒
	s = s < 10 ? '0' + s : s;
	timerObj = {
		day: d,
		hour: h,
		minute: m,
		second: s
	}
	// return d + '天' + h + '时' + m + '分' + s + '秒'; //返回函数计算出的值
	return timerObj

}
/**
 * 判断毫秒级时间戳
 * @param {*} time 
 * @returns 
 */
export function isMillisecondTimestamp(value) {
	return (
		typeof value === 'number' &&
		value > 0 && // 确保是正数
		value % 1 === 0 && // 确保是整数
		value.toString().length > 10) // 确保长度足够
}
// console.log(isMillisecondTimestamp(1617187277000)); // true
// console.log(isMillisecondTimestamp(1617187277)); // false，10位数内的整数不是时间戳
// console.log(isMillisecondTimestamp('2021-03-24')); // false，非数字
/**
 * 判断比较时间返回状态
 * @param {*} time 
 * @returns 
 */
export function compareTime(start_date, end_date) {
	let status = 0;
	let startDate = isMillisecondTimestamp(start_date) ? start_date : start_date * 1000;
	let endDate = isMillisecondTimestamp(end_date) ? end_date : end_date * 1000;
	let newDate = new Date().getTime();
	// console.log('1', formatDate(startDate), startDate);
	// console.log('2', formatDate(endDate), endDate);
	// console.log('3', formatDate(newDate), newDate, newDate > endDate);
	if (newDate <= startDate) { //在时间之前
		// console.log('statusstarts');
		return status = 0
	} else if (newDate > startDate && newDate <= endDate) { //正在组队中
		// console.log('statusing');
		return status = 1
	} else if (newDate > endDate) {
		// console.log('statusend');
		return status = 2
	}
	return status;
}


/**
 * 预览图片
 * @param {*} time 
 * @returns 
 */
export function previewImg(list, index = 0) {
	uni.previewImage({
		urls: list,
		current: index,
		longPressActions: {
			success: function(data) {},
			fail: function(err) {}
		}
	});
}
/**
 * 验证手机号
 * @param {*} phoneNumber 
 * @returns 
 */
export function isValidPhoneNumber(phoneNumber) {
	return /^1[3-9]\d{9}$/.test(phoneNumber);
}
/**
 * 表单验证函数
 * @param {*}  
 * @returns 
 */
export function validateForm(formData, rules) {
	let errors = {
		status: true
	};
	for (let field in rules) {
		if (rules.hasOwnProperty(field)) { //判断该字段是否存在
			const rule = rules[field];
			const value = formData[field];
			// 检查必填字段
			if (rule.required && !value) {
				errors[field] = rule.msg;
				errors.status = false;
				uni.$u.toast(rule.msg);
				break;
			}
			// 检查最大长度
			if (rule.maxLength && value.length > rule.maxLength) {
				errors[field] = rule.msg;
				errors.status = false;
				uni.$u.toast(rule.msg);
				break;
			}
			// 检验是否输入正确长度
			if (rule.len && value.length !== rule.len) {
				errors[field] = rule.msg;
				errors.status = false;
				uni.$u.toast(rule.msg);
				break;
			}
			//检验正则
			if (rule.reg && !rule.reg.test(value)) {
				errors[field] = rule.msg;
				errors.status = false;
				uni.$u.toast(rule.msg);
				break;
			}

			// 添加其他规则...
		}
	}
	// 返回验证结果，如果errors为空，则表示没有错误
	return errors;
	// return status;
}
/**
 * 处理等级
 * @param {*}  
 * @returns 
 */
export function convertLevel(level) {
	switch (level) {
		case 1:
			return '初级'
			break;
		case 2:
			return '中级'
			break;
		default:
			return '初级'
			break;
	}
}
/**
 * 判断小数点位数
 * @param {*}  
 * @returns 
 */
export function countDecimalPlaces(num) {
	var decimalPart = num.toString().match(/\.\d*/);
	// 判断是否有小数部分
	if (decimalPart) {
		return decimalPart[0].length - 1;
	} else {
		return 0;
	}
}
/**
 * 补全金额
 * @param {*}  
 * @returns 
 */
export function toDecimal2(price) {
	var f = parseFloat(price);
	if (isNaN(f)) {
		return '0.00';
	}
	var f = Math.round(price * 100) / 100;
	var s = f.toString();
	var rs = s.indexOf('.');
	if (rs < 0) {
		rs = s.length;
		s += '.';
	}
	while (s.length <= rs + 2) {
		s += '0';
	}
	return s;
}
/**
 * 处理图片
 * @param {*}  
 * @returns 
 */
export function $manageImg(src) {
	let newArr = [];
	if (typeof src === 'string') {
		newArr = src.split(',');
		return newArr;
	} else if (Array.isArray(src)) {
		newArr = src.map((val) => val.url)
		return newArr;
	} else {
		return newArr;
	}
}
/**
 * 手机脱敏
 * @param {*}  
 * @returns 
 */
export function maskPhoneNumber(phoneNumber) {
	return phoneNumber.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
}

// 示例使用
// const phoneNumber = '12345678901';
// const maskedPhoneNumber = maskPhoneNumber(phoneNumber);
// console.log(maskedPhoneNumber); // 输出: 123****8901
/**
 * 处理距离
 * @param {*}  
 * @returns 
 */
export function handleDistance(distance) {
	if (distance > 99) {
		return '>99'
	}
	return parseFloat(distance).toFixed(2);
}
/**
 * 解析Url
 * @param {*}  
 * @returns 
 */
export function parseURLParams3(url) {
	var params = {};
	var regex = /[?&]([^=#]+)=([^&#]*)/g;
	var match;
	while ((match = regex.exec(url))) {
		params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
	}
	return params;
}